home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / prg_casm / wsc4c10.zip / SIMPLE.C < prev    next >
Text File  |  1996-09-09  |  8KB  |  304 lines

  1. /*
  2. **                    --- simple.c ---
  3. **
  4. **  EXAMPLE CODE: Very simple terminal emulator.
  5. **
  6. */
  7.  
  8. #define USECOMM
  9.  
  10. #include "windows.h"
  11. #include "simple.h"
  12. #include "message.h"
  13. #include "wsc.h"
  14. #include "ascii.h"
  15. #include "config.h"
  16. #include "paint.h"
  17. #include "line.h"
  18. #include "menu.h"
  19. #include "about.h"
  20. #include "wscerror.h"
  21.  
  22. /* public globals */
  23.  
  24. HWND hMainWnd;            /* main window handle */
  25. HWND hInfoWnd;            /* popup handle */
  26. HANDLE hInstance;         /* program instance */
  27. int OnLineFlag = FALSE;   /* TRUE: online */
  28. int FatalFlag = FALSE;    /* TRUE: fatal error */
  29. char Temp[1024];
  30.  
  31. /* private globals */
  32.  
  33. static int WinWidth = 8 * NCOLS;
  34. static int WinHeight = 12 * NROWS + 48;
  35.  
  36. /* miscellaneous functions */
  37.  
  38. void ErrorCheck(int);
  39. void ErrorMessage(char *);
  40.  
  41. int PASCAL WinMain(HANDLE hInst,HANDLE hPrevInstance,
  42.                    LPSTR lpCmdLine,int nCmdShow)
  43. {WNDCLASS  wc;
  44.  MSG msg;
  45.  BOOL Result;
  46.  if(!hPrevInstance)
  47.    {/* register main window class */
  48.     wc.style = CS_HREDRAW | CS_VREDRAW;
  49.     wc.lpfnWndProc = MainWndProc;
  50.     wc.cbClsExtra = 0;
  51.     wc.cbWndExtra = 0;
  52.     wc.hInstance = hInst;
  53.     wc.hIcon = LoadIcon(hInst, "SimpleIcon");
  54.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  55.     wc.hbrBackground = GetStockObject(WHITE_BRUSH);
  56.     wc.lpszMenuName =  "SimpleMenu";
  57.     wc.lpszClassName = "SimpleWClass";
  58.     Result = RegisterClass(&wc);
  59.     if(!Result) return FALSE;
  60.    }
  61.  
  62.  /* create main window */
  63.  hInstance = hInst;
  64.  hMainWnd = CreateWindow(
  65.         "SimpleWClass",   "Simple",       WS_OVERLAPPEDWINDOW,
  66.         CW_USEDEFAULT,    CW_USEDEFAULT,
  67.         WinWidth,         WinHeight,
  68.         NULL,             NULL,
  69.         hInstance,        NULL);
  70.  ShowWindow(hMainWnd, nCmdShow);
  71.  UpdateWindow(hMainWnd);
  72.  
  73.  /* window control loop */
  74.  
  75.  while(GetMessage(&msg,NULL,NULL,NULL))
  76.    {
  77.     TranslateMessage(&msg);
  78.     DispatchMessage(&msg);
  79.    }
  80.  return (msg.wParam);
  81. } /* end WinMain */
  82.  
  83. long FAR PASCAL MainWndProc(HWND hWindow,UINT message,WPARAM wParam,LPARAM lParam)
  84. {int  i;
  85.  int  Count;
  86.  HDC  hDC;
  87.  UINT idTimer;
  88.  PAINTSTRUCT ps;
  89.  static FARPROC lpProcAbout;
  90.  static int ThePort;
  91.  
  92.  hMainWnd = hWindow;
  93.  switch (message)
  94.     {case WM_COMMAND:
  95.          switch(wParam)
  96.            {case MSG_ABOUT:
  97.               DialogBox(hInstance,"AboutBox",hMainWnd,lpProcAbout);
  98.               break;
  99.  
  100.             case MSG_DEBUG:
  101.               break;
  102.  
  103.             case MSG_ONLINE:
  104.               if(FatalFlag) ErrorMessage("Fatal Error");
  105.               else
  106.                 {/* try to go on-line */
  107.                  ThePort = GetPort();
  108.                  GoOnLine(ThePort);
  109.                  SetTitle();
  110.                  CheckTheMenu(MSG_ONLINE);
  111.                  UncheckTheMenu(MSG_OFFLINE);
  112.                  EnableTheMenu(MSG_OFFLINE);
  113.                  DisableTheMenu(MSG_ONLINE);
  114.                  for(i=0;i<4;i++) DisableTheMenu(MSG_COM1+i);
  115.                  DrawMenuBar(hMainWnd);
  116.                 }
  117.               break;
  118.  
  119.             case MSG_OFFLINE:
  120.  
  121.               CheckTheMenu(MSG_OFFLINE);
  122.               UncheckTheMenu(MSG_ONLINE);
  123.               EnableTheMenu(MSG_ONLINE);
  124.               DisableTheMenu(MSG_OFFLINE);
  125.               for(i=0;i<4;i++) EnableTheMenu(MSG_COM1+i);
  126.               GoOffLine(ThePort);
  127.               SetTitle();
  128.               DrawMenuBar(hMainWnd);
  129.               break;
  130.  
  131.             case MSG_EXIT:
  132.               GoOffLine(ThePort);
  133.               KillTimer(hMainWnd,idTimer);
  134.               PostQuitMessage(0);
  135.               break;
  136.  
  137.             case MSG_110:
  138.               SetBaud(Baud110);
  139.               break;
  140.  
  141.             case MSG_300:
  142.               SetBaud(Baud300);
  143.               break;
  144.  
  145.             case MSG_1200:
  146.               SetBaud(Baud1200);
  147.               break;
  148.  
  149.             case MSG_2400:
  150.               SetBaud(Baud2400);
  151.               break;
  152.  
  153.             case MSG_4800:
  154.               SetBaud(Baud4800);
  155.               break;
  156.  
  157.             case MSG_9600:
  158.               SetBaud(Baud9600);
  159.               break;
  160.  
  161.             case MSG_19200:
  162.               SetBaud(Baud19200);
  163.               break;
  164.  
  165.             case MSG_38400:
  166.               SetBaud(Baud38400);
  167.               break;
  168.  
  169.             case MSG_57600:
  170.               SetBaud(Baud57600);
  171.               break;
  172.  
  173.             case MSG_COM1:
  174.               SetPort(COM1);
  175.               break;
  176.  
  177.             case MSG_COM2:
  178.               SetPort(COM2);
  179.               break;
  180.  
  181.             case MSG_COM3:
  182.               SetPort(COM3);
  183.               break;
  184.  
  185.             case MSG_COM4:
  186.               SetPort(COM4);
  187.               break;
  188.  
  189.             case MSG_NONE:
  190.               SetParity(NoParity);
  191.               break;
  192.  
  193.             case MSG_EVEN:
  194.               SetParity(EvenParity);
  195.               break;
  196.  
  197.             case MSG_ODD:
  198.               SetParity(OddParity);
  199.               break;
  200.  
  201.             case MSG_1_SB:
  202.               SetStopBits(OneStopBit);
  203.               break;
  204.  
  205.             case MSG_2_SB:
  206.               SetStopBits(TwoStopBits);
  207.               break;
  208.  
  209.             case MSG_7_DB:
  210.               SetWordLength(WordLength7);
  211.               break;
  212.  
  213.             case MSG_8_DB:
  214.               SetWordLength(WordLength8);
  215.               break;
  216.  
  217.             default:
  218.               return (DefWindowProc(hMainWnd, message, wParam, lParam));
  219.            }
  220.          break;
  221.  
  222.     case WM_CREATE:
  223.  
  224.       /* check "OFFLINE" menu item */
  225.       CheckTheMenu(MSG_OFFLINE);
  226.       DisableTheMenu(MSG_OFFLINE);
  227.       /* create AboutDlgProc() thunk */
  228.       lpProcAbout = MakeProcInstance(AboutDlgProc, hInstance);
  229.       /* initialize paint module */
  230.       InitPaint();
  231.       /* init configuration */
  232.       CheckAll();
  233.       SetText((LPSTR)"SIMPLE");
  234.       SetTitle();
  235.       /* start timer */
  236.       idTimer = SetTimer(hMainWnd,1,125,NULL);
  237.       if(idTimer==0)
  238.          {ErrorMessage("No timers remaining !");
  239.           FatalFlag = TRUE;
  240.          }
  241.       break;
  242.  
  243.     case WM_CHAR:
  244.       SioPutc(ThePort, (char)wParam );
  245.       break;
  246.  
  247.     case WM_TIMER:
  248.       /* fatal error ? */
  249.       if(FatalFlag) break;
  250.       if(!OnLineFlag) break;
  251.       /* fetch up to 1024 chars */
  252.       Count = SioGets(ThePort,Temp,1024);
  253.       if(Count>0) WriteTheString(Temp,Count);
  254.       break;
  255.  
  256.     case WM_SETFOCUS:
  257.       /* create client area caret */
  258.       CreateCaret(hMainWnd,NULL,3,10);
  259.       SetCaretPos(GetXposition(),GetYposition());
  260.       ShowCaret(hMainWnd);
  261.       ShowCaret(hMainWnd);
  262.       break;
  263.  
  264.     case WM_KILLFOCUS:
  265.       DestroyCaret();
  266.       break;
  267.  
  268.     case WM_PAINT:
  269.       HideCaret(hMainWnd);
  270.       hDC = BeginPaint(hMainWnd, &ps);
  271.       SetMapMode(hDC,MM_ANISOTROPIC);
  272.       SelectObject(hDC, GetStockObject(OEM_FIXED_FONT) );
  273.       PaintMain(hDC,&ps);
  274.       EndPaint(hMainWnd,&ps);
  275.       SetCaretPos(GetXposition(),GetYposition());
  276.       ShowCaret(hMainWnd);
  277.       break;
  278.  
  279.     case WM_DESTROY:
  280.       GoOffLine(ThePort);
  281.       if(idTimer) KillTimer(hMainWnd,idTimer);
  282.       PostQuitMessage(0);
  283.       break;
  284.  
  285.     default:
  286.       return (DefWindowProc(hMainWnd, message, wParam, lParam));
  287.    }
  288.  return (NULL);
  289. } /* end MainWndProc */
  290.  
  291. void ErrorCheck(int Code)
  292. {/* trap PCL error codes */
  293.  if(Code<0)
  294.      {SioError(Code,"Sio Error");
  295.       SioDone(GetPort());
  296.       FatalFlag = TRUE;
  297.      }
  298. }
  299.  
  300. void ErrorMessage(char *MsgPtr)
  301. {
  302.  MessageBox(hMainWnd,MsgPtr,"ERROR",MB_ICONEXCLAMATION | MB_OK);
  303. }
  304.